<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>柯里化函数变换</title>
  <!-- 
  柯里化（Currying）是一种将接受多个参数的函数转换为一系列接受单一参数的函数的技术。柯里化函数的主要目的是将函数的参数分步传递，从而提高代码的灵活性和可重用性。
  一、柯里化的定义
  - 基本概念：柯里化将一个多参数函数转换为多个单参数函数。每个函数返回下一个函数，直到所有参数都被提供。这种方式使得函数的部分应用成为可能。

  二、柯里化的优势
  1. 提高复用性：
    - 柯里化使得函数可以更灵活地被复用。可以创建一个新的函数，只需部分提供参数。

  2. 增强可读性：
    - 柯里化可以使代码更清晰，特别是在使用高阶函数时。它使得函数的意图更加明显。

  3. 简化参数传递：
    - 柯里化允许逐步传递参数，避免了在调用时必须提供所有参数的情况。

  4. 便于函数组合：
    - 柯里化的函数更容易与其他函数组合，从而实现更复杂的功能。

  三、柯里化的实现
  以下是一个简单的柯里化函数的实现示例：
  // 柯里化函数
  function curry(fn) {
      return function curried(...args) {
          if (args.length >= fn.length) {
              return fn(...args); // 如果参数足够，调用原函数
          } else {
              return function(...args2) {
                  return curried(...args, ...args2); // 否则继续柯里化
              };
          }
      };
  }

  // 示例函数
  function add(a, b, c) {
      return a + b + c;
  }

  // 创建柯里化函数
  const curriedAdd = curry(add);

  console.log(curriedAdd(1)(2)(3)); // 输出: 6
  console.log(curriedAdd(1, 2)(3)); // 输出: 6
  console.log(curriedAdd(1, 2, 3)); // 输出: 6
  四、使用场景

  1. 函数式编程：在函数式编程中，柯里化是一个常用的技术，能够使代码更具可读性和可维护性。
  2. 事件处理：在事件处理时，柯里化可以用于预先设置一些参数，从而简化事件处理函数的调用。
  3. API调用：在需要多次调用某个API时，可以通过柯里化提前设置一些参数，简化后续的调用。

  五、总结
  柯里化是一种将多参数函数转换为一系列单参数函数的技术，能够提高代码的灵活性和可重用性。通过柯里化，开发者可以更方便地处理参数传递、函数组合和部分应用等问题。
   -->
</head>
<body>

  <script>
    // 1. 柯里化函数
    function curry(fn) {
      return function curried(...args) {
        if (args.length >= fn.length) {
          return fn(...args); // 如果参数足够，调用原函数
        } else {
          return function(...args2) {
            return curried(...args, ...args2); // 否则继续柯里化
          };
        }
      };
    }

    // 示例函数
    function add(a, b, c) {
      return a + b + c;
    }

    // 创建柯里化函数
    const curriedAdd = curry(add);

    console.log(curriedAdd(1)(2)(3)); // 输出: 6

    // 2. 柯里化函数逐步调用
    function currying(x) {
      return function(y) {
        return function(z) {
          console.log(x + y + z)
        }
      }
    }

    currying(10)(20)(30)

    // 3. 柯里化箭头函数
    const currying = (x) => (y) => (z) => console.log(x + y + z);

    currying(10)(20)(30)

    
  </script>
  
</body>
</html>